package xyz.fefine;

import java.util.List;

/**
 * Created by feng_ on 2016/9/16.
 * 数组的元素存放
 * 数组字面量
 * a = [1,2,3]
 * 或者a = Array[10]
 */
public class ArrayLiteral extends ASTList {
    public ArrayLiteral(List<ASTree> list) {
        super(list);
    }

    /**
     *
     * @return 第一个孩子,便于判断初始化类型
     */
    public ASTree firstChild() {
        return child(0);
    }

    /**
     *
     * @return 返回数组长度
     */
    protected ArrayRef arrayLen() {
        return (ArrayRef) child(1);
    }

    public int size() {
        return numChildren();
    }

    /**
     * 当第一个为name是说明创建指定长度的数组
     * @param enviorment 环境
     * @return 数组
     */
    @Override
    public Object eval(Enviorment enviorment) {
        if (firstChild() instanceof Name) {
            return eval2(enviorment);
        }
        int l = numChildren();
        Object[] val = new Object[l];
        int i = 0;
        for (ASTree asTree : children) {
            val[i++] = asTree.eval(enviorment);
        }
        return val;
    }

    /**
     *  创建指定长度的数组
     * @param env 环境
     * @return 数组
     */
    private Object eval2(Enviorment env) {

        Object l = arrayLen().eval(env);
        if (l instanceof Integer) {
            return new Object[((Integer) l)];
        }
        throw new StoneException("bad array init length",this);

    }

}
